/**
 * Component 构造器，可以指定组件的属性、数据、方法等。小程序的页面也可以视为自定义组件，拥有与普通组件一样的定义段与实例方法。但此时要求对应 json 文件中包含 usingComponents 定义段，哪怕只是设置为{}
 * Component 构造器描述：https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/wxml-wxss.html
 */
Component({
  // 提取所有页面中公用的代码段，所有页面被创建和销毁时都要执行同一段代码，就可把这段代码提取到 behaviors 中
  behaviors: [],
  
  // 可以理解为Vue中的Props
  properties: {
    myProperty: { // 属性名
      type: String,
      value: ''
    },
    myProperty2: String // 简化的定义方式
  },

  data: {}, // 私有数据，可用于模板渲染

  // 生命周期函数，可以为函数，或一个在methods段中定义的方法名
  lifetimes: {
    attached: function () { },
    moved: function () { },
    detached: function () { },
  },

  // 生命周期函数，可以为函数，或一个在methods段中定义的方法名
  attached: function () { }, // 此处attached的声明会被lifetimes字段中的声明覆盖
  ready: function() { },

  // 组件所在页面的生命周期函数 里面对应页面Page中的显示隐藏等生命周期
  pageLifetimes: {
    show() {
      if (typeof this.getTabBar === 'function' && this.getTabBar()) {
        this.getTabBar().setData({
          selected: 0
        })
      }
    }
  },

  // 组件所在页面的生命周期函数 以 on 开头的方法需写在该函数中
  methods: {
    onMyButtonTap: function(){
      this.setData({
        // 更新属性和数据的方法与更新页面数据的方法类似
      })
    },
    // 内部方法建议以下划线开头
    _myPrivateMethod: function(){
      // 这里将 data.A[0].B 设为 'myPrivateData'
      this.setData({
        'A[0].B': 'myPrivateData'
      })
    },
    _propertyChange: function(newVal, oldVal) {  }
  }
})